package 简单多状态问题;

/**
 * @Date 2024/6/6 16:39
 * @description: 力扣LCR91 粉刷房子
 * .            https://leetcode.cn/problems/JEj789/description/
 * @Author LittleNight
 */
public class likouLCR91 {

    public int minCost(int[][] costs) {
        int n = costs.length;
        // dp[i][0]: 表示第i个房子粉刷成红色所需要的最小花费
        // 1 是蓝色, 2 是绿色
        int[][] dp = new int[n + 1][3];
        dp[0][0] = dp[0][1] = dp[0][2] = 0;

        // 填表, 线性dp, 从左往右
        // 注意下标映射. 多加了一个格子
        for (int i = 1; i <= n; i++) {
            // 粉刷成红色
            dp[i][0] = Math.min(dp[i - 1][1], dp[i-1][2]) + costs[i-1][0];
            // 蓝色
            dp[i][1] = Math.min(dp[i - 1][0], dp[i-1][2]) + costs[i-1][1];
            // 绿色
            dp[i][2] = Math.min(dp[i - 1][0], dp[i-1][1]) + costs[i-1][2];
        }
        return Math.min(dp[n][0], Math.min(dp[n][1], dp[n][2]));
    }
}
